/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    eeprom.h
  * @brief   EEPROM读写模块头文件
  *          支持AT24C系列EEPROM芯片的I2C通信
  ******************************************************************************
  */
/* USER CODE END Header */

#ifndef __EEPROM_H__
#define __EEPROM_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"

/* EEPROM配置参数 ------------------------------------------------------------*/
#define EEPROM_I2C_HANDLE       &hi2c1          // 使用I2C1
#define EEPROM_DEVICE_ADDR      0xA0            // EEPROM设备地址(7位地址左移1位)
#define EEPROM_PAGE_SIZE        8               // 页大小(字节)
#define EEPROM_MAX_SIZE         256             // EEPROM总容量(字节)
#define EEPROM_TIMEOUT          1000            // 超时时间(ms)
#define EEPROM_WRITE_DELAY      5               // 写操作后延时(ms)

/* 函数声明 ------------------------------------------------------------------*/

/**
 * @brief  EEPROM初始化
 * @retval HAL_StatusTypeDef 状态
 */
HAL_StatusTypeDef EEPROM_Init(void);

/**
 * @brief  检查EEPROM是否就绪
 * @retval HAL_StatusTypeDef 状态
 */
HAL_StatusTypeDef EEPROM_IsReady(void);

/**
 * @brief  从EEPROM读取单个字节
 * @param  addr: 读取地址
 * @param  data: 数据指针
 * @retval HAL_StatusTypeDef 状态
 */
HAL_StatusTypeDef EEPROM_ReadByte(uint16_t addr, uint8_t *data);

/**
 * @brief  向EEPROM写入单个字节
 * @param  addr: 写入地址
 * @param  data: 要写入的数据
 * @retval HAL_StatusTypeDef 状态
 */
HAL_StatusTypeDef EEPROM_WriteByte(uint16_t addr, uint8_t data);

/**
 * @brief  从EEPROM读取多个字节
 * @param  addr: 起始地址
 * @param  data: 数据缓冲区指针
 * @param  size: 读取字节数
 * @retval HAL_StatusTypeDef 状态
 */
HAL_StatusTypeDef EEPROM_ReadBytes(uint16_t addr, uint8_t *data, uint16_t size);

/**
 * @brief  向EEPROM写入多个字节
 * @param  addr: 起始地址
 * @param  data: 数据缓冲区指针
 * @param  size: 写入字节数
 * @retval HAL_StatusTypeDef 状态
 */
HAL_StatusTypeDef EEPROM_WriteBytes(uint16_t addr, uint8_t *data, uint16_t size);

/**
 * @brief  页写入(提高写入效率)
 * @param  addr: 起始地址(必须页对齐)
 * @param  data: 数据缓冲区指针
 * @param  size: 写入字节数(不超过页大小)
 * @retval HAL_StatusTypeDef 状态
 */
HAL_StatusTypeDef EEPROM_WritePage(uint16_t addr, uint8_t *data, uint8_t size);

/**
 * @brief  擦除EEPROM(写入0xFF)
 * @param  addr: 起始地址
 * @param  size: 擦除字节数
 * @retval HAL_StatusTypeDef 状态
 */
HAL_StatusTypeDef EEPROM_Erase(uint16_t addr, uint16_t size);

#ifdef __cplusplus
}
#endif

#endif /* __EEPROM_H__ */